package com.freewater.parking.domain.parking;

import com.freewater.parking.domain.blacklist.InBlackListException;
import com.freewater.parking.domain.common.DomainService;
import com.freewater.parking.domain.common.EventQueue;

import java.time.LocalDateTime;

public interface ParkingService extends DomainService {
    /**
     * 检查车牌号是否为黑名单，如果为黑名单则抛出异常则入场失败，否则执行入场。
     *
     * @param queue       事件队列
     * @param parking     停车
     * @param checkInTime 入场时间
     * @throws InBlackListException 如果车牌号在黑名单中
     */
    boolean checkIn(EventQueue queue,
                    Parking parking,
                    LocalDateTime checkInTime) throws InBlackListException;


    /**
     * 计算未结清的停车费
     *
     * @param queue   事件队列
     * @param parking 停车
     * @param time    计算时间点
     * @return 未支付的停车费
     */
    int calcParkingFee(EventQueue queue,
                       Parking parking,
                       LocalDateTime time);

    /**
     * 停车费已支付事件处理
     *
     * @param queue    事件队列
     * @param parking  停车
     * @param payMoney 支付金额
     * @param payTime  支付时间
     */
    void payParkingFee(EventQueue queue,
                       Parking parking,
                       int payMoney,
                       LocalDateTime payTime);

    /**
     * 车辆出场
     *
     * @param queue        事件队列
     * @param parking      停车
     * @param checkOutTime 出场时间
     */
    boolean checkOut(EventQueue queue,
                     Parking parking,
                     LocalDateTime checkOutTime);
}
